package com.briup.es.web.controller;

import com.briup.es.config.auth.TokenMap;
import com.briup.es.config.auth.UserDetails;
import com.briup.es.config.response.Result;
import com.briup.es.domain.bean.User;
import com.briup.es.domain.dto.LoginDto;
import com.briup.es.domain.dto.RegisterUserDto;
import com.briup.es.domain.dto.UpdatePasswordDto;
import com.briup.es.domain.dto.UpdateUserDto;
import com.briup.es.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.validation.Valid;
import java.util.Map;

@Slf4j
@Api(tags = "登录认证模块")
@RestController
@RequestMapping("/user")
public class AuthController {

    @Resource
    private UserService userService;

    // @Valid表示需要对 LoginDto实体的对象属性值进行参数校验
    // 需要告知SpringMVC框架loginDto的数据需要从请求体中获取，并且该数据的格式为json
    @ApiOperation("用户登录接口")
    @PostMapping("/login")
    public Result<?> login(@Valid @RequestBody LoginDto loginDto) {
        // 调用service层方法，进行登录校验
        Map<String, Object> map = userService.login(loginDto);
        // 登录成功后，返回结果
        return Result.success(map).apply("登录成功");
    }

    @ApiOperation("用户退出登录")
    @GetMapping("/logout")
    public Result<?> logout() {
        Integer id = UserDetails.userId();
        // 将当前登录用户 在服务器内部的token清空
        TokenMap.remove(id);
        return Result.success();
    }

    @ApiOperation("获取当前登录用户的信息")
    @GetMapping("/getUserInfo")
    public Result<?> getUserInfo() {
        // 从UserDetails中获取当前登录用户的对象
        User user = UserDetails.currentUser();
        return Result.success(user)
                .apply("获取成功");
    }

    @ApiOperation("注册用户")
    @PostMapping("/register")
    public Result<?> register(@Valid @RequestBody RegisterUserDto userDto) {
        log.info("当前注册用户的信息:{}", userDto);
        // 调用service层方法，注册用户
        userService.register(userDto);
        return Result.success(null)
                .apply("注册成功");
    }

    @ApiOperation("修改用户信息")
    @PutMapping("/updateUser")
    public Result<?> updateUser(@Valid @RequestBody UpdateUserDto userDto) {
        userService.updateUser(userDto);
        return Result.success();
    }

    @ApiOperation("修改用户密码")
    @PutMapping("/updatePassword")
    public Result<?> updatePassword(@Valid @RequestBody UpdatePasswordDto passwordDto) {
        userService.updatePassword(passwordDto);
        return Result.success();
    }
}
